/*
*    Author : heiden deng(dengjianquan@beyondcent.com)
*    2017/07/19
*    version 0.0.9
*    黑白名单处理类声明
*/
#ifndef HTSC_FAILOVERUTILS_H
#define HTSC_FAILOVERUTILS_H
#include "grpc/impl/codegen/atm.h"
#include<map>
#include<vector>
#include<string>

#ifdef __cplusplus
extern "C" {
#endif

class FailoverUtils
{
private:
	//连续多少次请求出错，自动切换到提供相同服务的新服务器
	int m_switchThreshold;

	//服务提供者不可用时的惩罚时间，即多次请求出错的服务提供者一段时间内不再去请求
	//单位为豪秒,缺省值为60000
	int m_punishTime;

	//调用失败的【客户端对应服务提供者列表】,key值为：consumerId 
	std::map<std::string, std::vector<std::string> > m_failingProviders;

	//各个【客户端】最后一个服务提供者的删除时间,key值为：consumerId 
	std::map<std::string, uint64_t> m_removeProviderTimestamp;

	//各个【客户端对应服务提供者】最后一次服务调用失败时间,key值为：consumerId@IP:port
	std::map<std::string, uint64_t> m_lastFailingTimestamp;

	//各个【客户端对应服务提供者】服务调用失败次数,key值为：consumerId@IP:port
	std::map<std::string, gpr_atm> m_requestFailures;


public:
	FailoverUtils();
	~FailoverUtils();
	void setSwitchThreshold(int _switchThreshold);
	void setPunishTime(int _punishTime);
	void record_provider_failure(char* consumerId, char* providerId);
	void updateFailingProviders(char* consumerId, char* providerId);
	void updateFailTimes(char* consumerId, char* providerId, int64_t lastTimestamp, int64_t currentTimestamp);

};

#ifdef __cplusplus
}
#endif

#endif // !HTSC_FAILOVERUTILS_H




